const list = [
  { id: 1, parentId: null, name: '1' },
  {
    id: 2,
    parentId: null,
    name: '2'
  },
  {
    id: 3,
    parentId: 1,
    name: '3'
  },
  {
    id: 4,
    parentId: 3,
    name: '4'
  }
]

function getChildrenIds(arr, parentId, result) {
  // 获取直接子级 Ids
  const childrenIds = arr.filter((item) => item.parentId === parentId).map((item) => item.id)

  // 循环直接子级，递归调用 getChildrenIds
  childrenIds.forEach((id) => {
    getChildrenIds(arr, id, result)
  })

  result.push(...childrenIds)

  return result
}

// 获取Id为 1 的所有子级Id的集合 [3, 4]
console.log(getChildrenIds(list, 1, []))
// 获取Id为 2 的所有子级Id的集合 []
console.log(getChildrenIds(list, 2, []))
// 获取Id为 3 的所有子级Id的集合 [4]
console.log(getChildrenIds(list, 3, []))
